package com.txazo.eao.impl;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.txazo.eao.JpaEao;

/**
 * JPA通用Eao实现
 * 
 * @author txazo
 * @since 1.0
 */
@Stateless(name = "jpaEao")
public class JpaEaoImpl implements JpaEao {

	/** JPA的实体管理器 */
	@PersistenceContext(unitName = "txazoUnit")
	protected EntityManager entityManager;

	/**
	 * 持久化实体
	 * 
	 * @param <T> 泛型
	 * @param t 实体
	 */
	@Override
	public <T> void save(T t) {
		entityManager.persist(t);
	}

	/**
	 * 删除实体
	 * 
	 * @param <T> 泛型
	 * @param t 实体
	 */
	@Override
	public <T> void delete(T t) {
		entityManager.remove(t);
	}

	/**
	 * 根据主键删除实体
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param id 实体主键
	 */
	@Override
	public <T> void delete(Class<T> entityClass, Integer id) {
		entityManager.remove(get(entityClass, id));
	}

	/**
	 * 更新实体
	 * 
	 * @param <T> 泛型
	 * @param t 实体
	 */
	@Override
	public <T> void update(T t) {
		entityManager.merge(t);
	}

	/**
	 * 查询实体
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param id 实体主键
	 * @return 实体
	 */
	@Override
	public <T> T get(Class<T> entityClass, Integer id) {
		return entityManager.find(entityClass, id);
	}

	/**
	 * 查询实体集
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @return 实体集
	 */
	@Override
	public <T> List<T> findAll(Class<T> entityClass, String jpql) {
		return entityManager.createQuery(jpql, entityClass).getResultList();
	}

	/**
	 * 查询实体集
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param param 参数
	 * @return 实体集
	 */
	@Override
	public <T> List<T> findAll(Class<T> entityClass, String jpql, Object param) {
		return entityManager.createQuery(jpql, entityClass).setParameter(1,
				param).getResultList();
	}

	/**
	 * 查询实体集
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param params 参数集
	 * @return 实体集
	 */
	@Override
	public <T> List<T> findAll(Class<T> entityClass, String jpql,
			Object[] params) {
		Query query = entityManager.createQuery(jpql, entityClass);
		for (int i = 0; i < params.length; i++) {
			query = query.setParameter(i + 1, params[i]);
		}
		return query.getResultList();
	}

	/**
	 * 分页查询
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param firstResult 开始记录
	 * @param maxResult 查询记录数
	 * @return 实体集
	 */
	@Override
	public <T> List<T> findByPage(Class<T> entityClass, String jpql,
			int firstResult, int maxResult) {
		return entityManager.createQuery(jpql, entityClass).setFirstResult(
				firstResult).setMaxResults(maxResult).getResultList();
	}

	/**
	 * 分页查询
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param param 参数
	 * @param firstResult 开始记录
	 * @param maxResult 查询记录数
	 * @return 实体集
	 */
	@Override
	public <T> List<T> findByPage(Class<T> entityClass, String jpql,
			Object param, int firstResult, int maxResult) {
		return entityManager.createQuery(jpql, entityClass).setParameter(1,
				param).setFirstResult(firstResult).setMaxResults(maxResult)
				.getResultList();
	}

	/**
	 * 分页查询
	 * 
	 * @param <T> 泛型
	 * @param entityClass 实体类
	 * @param jpql JPQL查询语句
	 * @param params 参数集
	 * @param firstResult 开始记录
	 * @param maxResult 查询记录数
	 * @return 实体集
	 */
	@Override
	public <T> List<T> findByPage(Class<T> entityClass, String jpql,
			Object[] params, int firstResult, int maxResult) {
		Query query = entityManager.createQuery(jpql, entityClass);
		for (int i = 0; i < params.length; i++) {
			query = query.setParameter(i + 1, params[i]);
		}
		return query.setFirstResult(firstResult).setMaxResults(maxResult)
				.getResultList();
	}

	public EntityManager getEntityManager() {
		return entityManager;
	}

}
